PostgreSQL Pod
Pod だと既存のDocker構文で記述して systemd に登録しやすい
日本語用にカスタマイズをする場合はDockerfileから
code:Dockerfile17
FROM docker.io/postgres:17
RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.utf8
ENV TZ Asia/Tokyo
バージョン別に使えるようにしておく
POSTGRES_INITDB_ARGS を --locale=C --encoding=utf-8 などにする場合はなくてもいいかも
そのままbuild するには
$ podman build -f Dockerfile17 -t siisise/postgres:17 .
-f Dockerfile Composefile 以外の名前の場合
-t image名
. 対象ディレクトリ/フォルダ
コンテナの create だけして実行はしない
オプションはいろいろ略
image は カスタマイズしたものでもしてないものでもお好みで
$ podman create --name pgsql17 docker.io/postgres:17
-p 5432:5432
-e "POSTGRES_INITDB_ARGS=--locale=C --encoding=utf-8"
-v pgdata17:/var/lib/postgresql/data
-v ./sql:/docker-entrypoint-initdb.d
公開ポート 5432
PostgreSQL initdbの初期化パラメータに localeとencodingを指定
データディレクトリと初期化スクリプト格納ディレクトリのマウント
環境変数は Dockerfile の ENV で記述しても podman create の -e で付けてもいい
table:環境変数
TZ Asia/Tokyo タイムゾーン指定 (仮?
LANG ja_JP.utf8 言語指定、使えるかは謎
POSTGRES_INITDB_ARGS --locale=C 比較などに影響するので速い方にカスタム
--encoding=utf-8 それでも文字コードはutf-8
POSTGRES_USER 管理ユーザ
POSTGRES_PASSWORD 管理ユーザパスワード
POSTGRES_DB 初期DB
pgsql-pod.yaml に変換する
kube generate で Pod のyaml ファイルを出力
$ podman kube generate pgsql17 -f pgsql17-pod.yaml
コンテナは不要なので捨てる
$ podman rm pgsql17
作成完了
コンテナ作成のオプションをファイルに残しておきたいので
Podman Compose用経由でPodにしてみる場合
code:compose.yaml
services:
db:
image: siisise/postgres:17
container_name: pgsql17
build:
context: .
dockerfile: Dockerfile17
ports:
- "5432:5432"
environment:
TZ: "Asia/Tokyo"
LANG: "ja_JP.utf8"
POSTGRES_INITDB_ARGS: "--locale=C --encoding=utf-8"
POSTGRES_USER: "user"
POSTGRES_PASSWORD: "password"
POSTGRES_DB: "db"
volumes:
pgdata17:/var/lib/postgresql/data
volumes:
pgdata17:
仮
POSTGRES_INITDB_ARGS お好みで --locale=C をつけてみた ja_JP も使えるかな
POSTGRES_USER ユーザ (管理権限あり)
POSTGRES_PASSWORD パスワード
POSTGRES_DB ユーザ名と別の場合
container_name は Pod に変換しやすいように固定しているだけなので Composeで使う場合はつけないほうがいい
volume もバージョン別にしておく
/docker-entrypoint-initdb.d/ に.sqlや.sh なファイルを置くと実行できる
指定したPOSTGRES_USERで実行され、psql で利用可能な \c なども使える
AlpineベースのPostgres 15以降は ICU locale をサポートしているらしい
POSTGRES_INITDB_ARGS を設定する
$ podman run -e LANG=ja_JP.utf8 -e POSTGRES_INITDB_ARGS="--locale-provider=icu --icu-locale=ja-JP" postgres:15-alpine
これも podman compose 用にしてみる
code:compose.yaml
services:
db:
image: docker.io/postgres:17-alpine
container_name: pgsql17a
ports:
- "127.0.0.1:5432:5432"
environment:
TZ: "Asia/Tokyo"
LANG: "ja_JP.utf8"
POSTGRES_INITDB_ARGS: "--locale-provider=icu --icu-locale=ja-JP"
POSTGRES_USER: user
POSTGRES_PASSWORD: example
volumes:
pgdata17a:/var/lib/postgresql/data
volumes:
pgdata17a:
のようにしてみた
ports はローカル接続用
compose.yaml を Pod用 pgsql-pod.yaml に変換する
$ podman compose up -d
で実行してから保存
$ podman generate kube pgsql17a -f pgsql-pod.yaml
$ podman compose down
で compose の停止
作成完了
実行
$ podman kube play pgsql-pod.yaml
停止
$ podman kube down pgsql-pod.yaml
Linux 環境ではない場合はVM内での作業かもしれない
kube play unit を参考に
postgres.kube を作る (systemd の既存の名前とかぶらないこと postgres17.kube などにする)
code:postgres.kube
Description=PostgreSQL Server
Before=local-fs.target
Yaml=/var/local/etc/pgsql-pod.yaml
PublishPort=127.0.0.1:5432:5432
Restart=always
WantedBy=multi-user.target default.target
Kube のYaml に podのyamlファイルのPathを記述する
PublishPort を必要に応じて変更する
必要なファイルは pgsql-pod.yaml と postgres.kube の2つのみ
rootの場合
postgres.kube を /etc/containers/systemd にコピーする
# cp postgres.kube /etc/containers/systemd
無効にする場合は削除する
設定再読み込み
# systemctl daemon-reload
systemctl enable postgres は不要
Linux 起動時と連動する
reboot では無反応
すぐに起動したい場合は
# systemctl start postgres
podman 系のコマンドで開始・停止などの操作をしないこと
起動
$ systemctl start postgres
停止
$ systemctl stop postgres
再起動
$ systemctl restart postgres
状態確認
$ systemctl status postgres
$ podman ps
$ podman pod ps
$ podman logs コンテナ名
rootless user の場合
postgres.kube を ~/.config/containers/systemd/ にコピーする
$ systemctl --user daemon-reload
$ systemctl --user start postgres
など
管理系
pgsql コマンドでリモート接続すれば外から管理も可能
基本的にリモート接続で全部管理できる
コンテナに入るのは bash で postgres ユーザくらいになればいいか
$ podman exec -it コンテナ名 bash -c "su - postgres"
$ psql